جزوه · فصل دوم · جلسه ۲۸ · محدود کردن کاربر SSH با chroot (جامع) ← بازگشت به فهرست
📘 فصل دوم · جلسه ۲۸ محدود کردن کاربر SSH با chroot (جامع)
📅 تاریخ: سه‌شنبه، ۲۰ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat

▍ مقدمه

چندین دلیل برای محدود کردن دسترسی کاربر SSH به یک دایرکتوری خاص وجود دارد که مهم‌ترین آن امنیت سیستم است. برای قفل کردن کاربران SSH در یک دایرکتوری مشخص، از مکانیزم chroot استفاده می‌کنیم.

🔑 chroot چیست؟

chroot (مخفف Change Root) در سیستم‌های شبه‌یونیکس مانند لینوکس، یک روش برای جدا کردن عملیات‌های خاص کاربر از بقیه سیستم است. این مکانیزم، دایرکتوری ریشه را برای یک فرآیند در حال اجرا و فرزندانش به یک دایرکتوری ریشه جدید که زندان chroot (Chrooted Jail) نامیده می‌شود، تغییر می‌دهد.

▍ کتابخانه (Library) چیست؟

در لینوکس، کتابخانه (Library) مجموعه‌ای از توابع (Functions) است که برنامه‌ها می‌توانند از آنها استفاده کنند. توابع، قطعه‌های کد مستقلی هستند که کارهای خاصی را انجام می‌دهند، مانند باز کردن یک فایل، خواندن داده، یا محاسبه یک مقدار.

🔑 مزیت اصلی کتابخانه‌ها:

به جای اینکه هر برنامه این توابع را داخل خودش داشته باشد، همه برنامه‌ها از یک کتابخانه مشترک استفاده می‌کنند. این کار باعث صرفه‌جویی در فضا و سهولت به‌روزرسانی می‌شود.

▍ انواع کتابخانه در لینوکس

🔵 کتابخانه Static

  • در زمان کامپایل کپی می‌شود.
  • اندازه برنامه بزرگتر است.
  • به‌روزرسانی نیاز به کامپایل مجدد دارد.
  • پسوند: .a (Archive)

🔴 کتابخانه Shared (Dynamic)

  • در زمان اجرا (Runtime) بارگذاری می‌شود.
  • اندازه برنامه کوچکتر است.
  • به‌روزرسانی بدون کامپایل مجدد امکان‌پذیر است.
  • پسوند: .so (Shared Object)
💡 نکته:

در ویندوز، کتابخانه‌های پویا با پسوند .dll (Dynamic Linked Library) شناخته می‌شوند که معادل .so در لینوکس هستند.

▍ محل قرارگیری کتابخانه‌ها

سیستم برای پیدا کردن کتابخانه‌ها از ترتیب زیر پیروی می‌کند:

  1. متغیر محیطی LD_LIBRARY_PATH (اولویت اول)
  2. مسیرهای PATH برنامه
  3. پوشه /etc/ld.so.conf.d/ (فایل‌های کانفیگ)
  4. فایل /etc/ld.so.conf (کانفیگ اصلی)
  5. پوشه‌های /lib*/ و /usr/lib*/ (پیش‌فرض)

▍ دستور ldd (نمایش وابستگی‌های کتابخانه‌ای)

ldd مخفف List Dynamic Dependencies است و کتابخانه‌های پویا (Shared Libraries) که یک برنامه به آنها نیاز دارد را نمایش می‌دهد.

📌 ساختار کلی:
ldd [options] program

• مثال عملی با دستور ls

┌──(ya3in㉿kali)-[~] └─$ whereis ls ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz └─$ ldd /usr/bin/ls linux-vdso.so.1 (0x00007ffd21d6a000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fe2308a82000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe23085a000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007fe2307c3000)
/ib64/ld-linux-x86-64.so.2 (0x00007fe230ae7000)

توضیح: خروجی نشان می‌دهد که ls به کتابخانه‌های مختلفی وابسته است. این کتابخانه‌ها باید در محیط chroot نیز موجود باشند تا دستورات به درستی کار کنند.

▍ راهنمای گام‌به‌گام محدود کردن کاربر SSH با chroot

📌 پیش‌نیازها:
  • دسترسی root یا کاربری با قابلیت اجرای دستورات sudo.
  • سیستم‌عامل لینوکس (دبیان/کالی یا رد هت).
  • بسته openssh-server نصب و فعال باشد.

• مرحله ۱: ایجاد زندان chroot

┌──(ya3in㉿kali)-[~] └─$ sudo mkdir -p /home/test

توضیح: با دستور mkdir -p دایرکتوری /home/test را ایجاد می‌کنیم. گزینه -p باعث می‌شود اگر دایرکتوری والد (مثلاً home) وجود نداشته باشد، آن را نیز بسازد. این دایرکتوری به عنوان ریشه جدید (زندان chroot) برای کاربر محصور شده عمل خواهد کرد.

• مرحله ۲: ایجاد دستگاه‌های مورد نیاز در /dev

طبق صفحه راهنمای sshd_config، گزینه ChrootDirectory مسیر دایرکتوری را برای chroot پس از احراز هویت مشخص می‌کند. این دایرکتوری باید شامل فایل‌ها و دایرکتوری‌های لازم برای پشتیبانی از جلسه کاربر باشد. برای یک جلسه تعاملی، حداقل به یک شل (معمولاً sh) و گره‌های اولیه /dev مانند null، zero، stdin، stdout، stderr و دستگاه‌های tty نیاز است.

┌──(ya3in㉿kali)-[~] └─$ sudo mkdir -p /home/test/dev └─$ sudo cd /home/test/dev └─$ sudo mknod -m 666 null c 1 3 └─$ sudo mknod -m 666 tty c 5 0 └─$ sudo mknod -m 666 zero c 1 5 └─$ sudo mknod -m 666 random c 1 8

توضیح دستورات:

💡 نکته:

دستور mknod برای ایجاد فایل‌های دستگاه (Device Files) استفاده می‌شود. گزینه -m برای تنظیم مجوزها، c برای دستگاه کاراکتری و دو عدد آخر (Major و Minor) برای شناسایی دستگاه هستند. این فایل‌ها برای عملکرد صحیح محیط chroot حیاتی هستند.

• مرحله ۳: تنظیم مجوزهای دایرکتوری chroot

┌──(ya3in㉿kali)-[~] └─$ sudo chown root:root /home/test └─$ sudo chmod 0755 /home/test

توضیح:

• مرحله ۴: تنظیم shell تعاملی (کپی کردن bash و کتابخانه‌های آن)

┌──(ya3in㉿kali)-[~] └─$ sudo mkdir -p /home/test/bin └─$ sudo cp -v /bin/bash /home/test/bin/

توضیح:

اکنون باید کتابخانه‌های مورد نیاز bash را شناسایی و کپی کنیم:

┌──(ya3in㉿kali)-[~] └─$ sudo ldd /bin/bash linux-vdso.so.1 (0x00007ffd21d6a000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f8c4b1a0000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8c4ae70000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8c4af00000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8c4b1c0000)
└─$ sudo mkdir -p /home/test/lib64 └─$ sudo cp -v /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /home/test/lib64/

توضیح:

• مرحله ۵: ایجاد و پیکربندی کاربر SSH

┌──(ya3in㉿kali)-[~] └─$ sudo useradd tecmint └─$ sudo passwd tecmint

توضیح:

اکنون باید فایل‌های /etc/passwd و /etc/group را به زندان کپی کنیم تا کاربر شناسایی شود:

┌──(ya3in㉿kali)-[~] └─$ sudo mkdir /home/test/etc └─$ sudo cp -vf /etc/{passwd,group} /home/test/etc/

توضیح:

⚠️ نکته امنیتی مهم:

هر بار که کاربر جدیدی به سیستم اضافه می‌شود، باید فایل‌های /etc/passwd و /etc/group را دوباره به محیط chroot کپی کنید تا کاربر جدید نیز قابل شناسایی باشد.

• مرحله ۶: پیکربندی SSH برای استفاده از chroot

فایل پیکربندی SSH را ویرایش می‌کنیم:

┌──(ya3in㉿kali)-[~] └─$ sudo nano /etc/ssh/sshd_config

توضیح: این دستور فایل sshd_config را در ویرایشگر nano باز می‌کند. این فایل اصلی‌ترین فایل پیکربندی سرویس SSH است.

خطوط زیر را به انتهای فایل اضافه کنید:

# تعیین کاربری که chroot برای او اعمال می‌شود Match User tecmint # مشخص کردن دایرکتوری chroot ChrootDirectory /home/test # (اختیاری) برای SFTP ForceCommand internal-sftp

توضیح:

پس از ذخیره تغییرات، سرویس SSH را مجدداً راه‌اندازی می‌کنیم:

┌──(ya3in㉿kali)-[~] └─$ sudo systemctl restart sshd

توضیح: با دستور systemctl restart sshd سرویس SSH را مجدداً راه‌اندازی می‌کنیم تا تغییرات اعمال شوند. در سیستم‌های قدیمی‌تر ممکن است از service sshd restart استفاده شود.

• مرحله ۷: تست chroot

اکنون با کاربر tecmint به سیستم متصل می‌شویم:

┌──(ya3in㉿kali)-[~] └─$ ssh tecmint@192.168.0.10 -bash-4.1$ ls
-bash-4.1$ date
-bash-4.1$ uname

نتیجه: همان‌طور که در خروجی مشاهده می‌کنید، کاربر نمی‌تواند هیچ دستور خارجی مانند ls، date یا uname را اجرا کند. فقط دستورات داخلی (built-in) bash مانند pwd، echo و history در دسترس هستند. این یعنی کاربر در زندان chroot محصور شده است.

✅ تأیید موفقیت:

اگر کاربر نتوانست دستورات خارجی را اجرا کند، یعنی chroot به درستی پیکربندی شده است و کاربر فقط به دایرکتوری /home/test دسترسی دارد.

• مرحله ۸: اضافه کردن دستورات جدید به chroot

اگر می‌خواهید کاربر بتواند دستورات خاصی (مثل ls، date، mkdir) را اجرا کند، باید آنها را به زندان اضافه کنید.

ابتدا دایرکتوری خانه کاربر را در زندان ایجاد می‌کنیم:

┌──(ya3in㉿kali)-[~] └─$ sudo mkdir -p /home/test/home/tecmint └─$ sudo chown -R tecmint:tecmint /home/test/home/tecmint └─$ sudo chmod -R 0700 /home/test/home/tecmint

توضیح:

سپس دستورات مورد نظر را کپی می‌کنیم:

┌──(ya3in㉿kali)-[~] └─$ sudo cp -v /bin/ls /home/test/bin/ └─$ sudo cp -v /bin/date /home/test/bin/ └─$ sudo cp -v /bin/mkdir /home/test/bin/

توضیح: این دستورات فایل‌های اجرایی ls، date و mkdir را از سیستم اصلی به دایرکتوری bin زندان کپی می‌کنند.

حالا باید کتابخانه‌های مورد نیاز این دستورات را نیز کپی کنیم. ابتدا با ldd آنها را شناسایی می‌کنیم:

┌──(ya3in㉿kali)-[~] └─$ sudo ldd /bin/ls linux-vdso.so.1 (0x00007ffd21d6a000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fe2308a82000)
libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007fe2307c3000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007fe2307b8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe23085a000)
libpcre.so.1 => /lib/x86_64-linux-gnu/libpcre.so.1 (0x00007fe2307c3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe2307b8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe230ae7000)
└─$ sudo cp -v /lib64/{libselinux.so.1,libcap.so.2,libacl.so.1,libc.so.6,libpcre.so.1,libdl.so.2,ld-linux-x86-64.so.2} /home/test/lib64/

توضیح: با ldd /bin/ls کتابخانه‌های مورد نیاز ls را شناسایی کرده و سپس آنها را به دایرکتوری lib64 زندان کپی می‌کنیم. اگر کتابخانه‌ای قبلاً کپی شده باشد، باز هم کپی می‌شود (با گزینه -v می‌توانید ببینید چه چیزی کپی می‌شود).

• تست نهایی با دستورات جدید

اکنون دوباره با کاربر tecmint به سیستم متصل می‌شویم:

┌──(ya3in㉿kali)-[~] └─$ ssh tecmint@192.168.0.10 -bash-4.1$ ls
bin dev etc home lib64
-bash-4.1$ date
Tue Aug 11 12:00:00 UTC 2026
-bash-4.1$ mkdir testdir
-bash-4.1$ ls
bin dev etc home lib64 testdir

نتیجه: کاربر اکنون می‌تواند دستورات ls، date و mkdir را در محیط chroot اجرا کند، اما همچنان به فایل‌های خارج از زندان /home/test دسترسی ندارد. این یعنی تنظیمات ما با موفقیت انجام شده است.

▍ نکات مهم و عیب‌یابی

✅ نکات کلیدی:
  • دایرکتوری chroot و همه زیردایرکتوری‌های آن (به جز دایرکتوری خانه کاربر) باید متعلق به root باشند.
  • برای افزودن هر دستور جدید به زندان، باید کتابخانه‌های مورد نیاز آن را با ldd شناسایی و به lib یا lib64 زندان کپی کنید.
  • هر بار که کاربر جدیدی به سیستم اضافه می‌شود، فایل‌های /etc/passwd و /etc/group را به‌روز کنید.
  • برای استفاده از SFTP در محیط chroot، از ForceCommand internal-sftp در sshd_config استفاده کنید و مطمئن شوید که Subsystem sftp internal-sftp نیز تنظیم شده است.
  • اگر خطای /bin/bash: No such file or directory دریافت کردید، /bin/sh را نیز به زندان کپی کنید.
  • برای اجرای دستورات بدون نیاز به مسیر کامل، متغیر PATH را در محیط chroot تنظیم کنید (ایجاد فایل /home/test/etc/profile).
⚠️ خطاهای رایج و راه‌حل‌ها:
خطا راه‌حل
Permission denied (publickey) مسیر authorized_keys را در sshd_config برای کاربر تنظیم کنید یا از احراز هویت با رمز عبور استفاده کنید.
/bin/bash: No such file or directory کتابخانه‌های bash را به‌درستی کپی نکرده‌اید. با ldd دوباره بررسی کنید و /bin/sh را نیز کپی کنید.
client_loop: send disconnect: Broken pipe مالکیت دایرکتوری chroot را بررسی کنید (باید root:root باشد) و مجوزها را به 0755 تنظیم کنید.
ls: command not found کتابخانه‌های مورد نیاز ls را با ldd شناسایی و به زندان کپی کنید.
error: /dev/pts/2: No such file or directory دستگاه‌های /dev/pts را در زندان mount کنید یا از mknod برای ایجاد آنها استفاده کنید.

▍ جمع‌بندی نهایی

✅ تمرین پیشنهادی:
  • با ldd وابستگی‌های کتابخانه‌ای برنامه‌های bash و python3 را بررسی کنید.
  • یک کاربر جدید ایجاد کنید و او را در یک chroot jail قرار دهید (مراحل بالا را تکرار کنید).
  • دستورات cp و mv را به chroot اضافه کنید (کتابخانه‌های آنها را نیز کپی کنید).
  • با ForceCommand internal-sftp کاربر را به SFTP محدود کنید و تست کنید.
  • لاگ‌های /var/log/secure (در رد هت) یا /var/log/auth.log (در دبیان) را برای خطاهای احتمالی بررسی کنید.
  • متغیر PATH را در محیط chroot تنظیم کنید تا کاربر بتواند دستورات را بدون مسیر کامل اجرا کند.